package com.example.mqtt.server.netty;

import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.mqtt.MqttDecoder;
import io.netty.handler.codec.mqtt.MqttEncoder;
import io.netty.handler.timeout.IdleStateHandler;

/**
 *  当一个新的连接被接受时，个新的Channel将被创建，同时它会被自动地分配到它专属的ChannelPipeline
 *  为了支持MQTT，必须要给它提供相应的编解码器
 *  在请求进来或者响应出去时都会经过链上这些ChannelHandler的处理。
 */
public class MqttChannelInitializer extends ChannelInitializer {
    @Override
    protected void initChannel(Channel channel) throws Exception {
        ChannelPipeline channelPipeline = channel.pipeline();
        // 设置读写空闲超时时间
        channelPipeline.addLast(new IdleStateHandler(600, 600, 1200));
        // 添加ChannelHandler：处理MQTT消息的编解码
        channelPipeline.addLast("encoder", MqttEncoder.INSTANCE);
        channelPipeline.addLast("decoder", new MqttDecoder());
        // 添加自定义ChannelHandler，处理自定义的业务逻辑
        channelPipeline.addLast(new MqttChannelInboundHandler());
    }
}
